/*
 * @Author: wwssaabb
 * @Date: 2021-09-04 16:05:59
 * @LastEditTime: 2021-09-04 16:44:25
 * @FilePath: \handwritten-code\demo\数组去重.js
 */

/* 
  数组去重
*/

let arr = [1, 1, "1", "1", true, true, "true", {}, {}, "{}", null, null, undefined, undefined]

const log = ctx => console.log(ctx)
const checkIsArray = arr => {
  if (!Array.isArray(arr)) throw new TypeError('Must accept Array')
}

//方法1，利用Set集合的特性去重
const arr1 = [...new Set(arr)]
//log(arr1) //[ 1, '1', true, 'true', {}, {}, '{}', null, undefined ]

//方法2，reduce+includes  /  reduce+indexOf
function unique2(arr) {
  checkIsArray(arr)
  return arr.reduce((p, c) => {
    if (!p.includes(c)) {
      p.push(c)
    }

    /* if (p.indexOf(c) !== -1) {
      p.push(c)
    } */

    return p
  }, [])
}

//unique2(arr) //[ 1, '1', true, 'true', {}, {}, '{}', null, undefined ]

//方法3，利用Map对象属性不能重复的特性,普通对象的键会自动转换成string类型，Map对键的类型没有限制
function unique3(arr) {
  checkIsArray(arr)

  return [...arr.reduce((p, c) => {
    if (!p.has(c)) {
      p.set(c, c)
    }
    return p
  }, new Map()).keys()]
}

//log(unique3(arr)) //[ 1, '1', true, 'true', {}, {}, '{}', null, undefined ]

//方法4，filter+indexOf
function unique4(arr) {
  checkIsArray(arr)

  return arr.filter((item, index) => arr.indexOf(item) === index)
}
log(unique4(arr))



//数组去重总结：
//方法一：ES6 set集合特性去重
//方法二：ES6 Map键属性不能重复特性
//方法三：reduce+includes

function unique(arr) {
  // return [...new Set(arr)]

  // return [...arr.reduce((p, c) => {
  //   p.set(c, c)
  //   return p
  // }, new Map()).keys()]

  return arr.reduce((p, c) => {
    // if (!p.includes(c)) p.push(c)
    if (p.indexOf(c) === -1) p.push(c)
    return p
  }, [])
}